47. 基于HTTP的监控和管理

如果你正在开发一个Spring MVC应用,Spring Boot执行器自动将所有启用的端点通过HTTP暴露出去。默认约定使用端点的id作为URL路径,例如,health暴露为/health

47.1 保护敏感端点

如果你的项目添加了‘Spring Security’依赖,所有通过HTTP暴露的敏感端点都会受到保护,默认情况下会使用用户名为user的基本认证(basic authentication),产生的密码会在应用启动时打印到控制台上。

在应用启动时会记录生成的密码,具体搜索Using default security password

你可以使用Spring属性改变用户名,密码和访问端点需要的安全角色。例如,你可以将以下配置添加到application.properties中:

security.user.name=admin
security.user.password=secret
management.security.role=SUPERUSER

如果不使用Spring Security,并且公开暴露HTTP端点,你应该慎重考虑启用哪些端点,具体参考Section 46.1, “Customizing endpoints”

47.2 自定义管理端点路径

有时将所有管理端点划分到单个路径下是有用的。例如,/info可能已被应用占用,你可以用management.contextPath属性为管理端点设置一个前缀:

management.context-path=/manage

以上的application.properties示例将把端点从/{id}改为/manage/{id}(比如/manage/info)。

你也可以改变端点的id(使用endpoints.{name}.id)来改变MVC端点的默认资源路径,合法的端点ids只能由字母数字组成(因为它们可以暴露到很多地方,包括不允许特殊字符的JMX对象name)。MVC路径也可以通过配置endpoints.{name}.path来单独改变,Spring Boot不会校验这些值(所以你可以使用URL中任何合法的字符)。例如,想要改变/health端点路径为/ping/me,你可以设置endpoints.health.path=/ping/me

如果你提供一个自定义MvcEndpoint,记得包含一个可设置的path属性,并像标准MVC端点那样将该属性默认设置为/{id}(具体可参考HealthMvcEndpoint)。如果你的自定义端点是一个Endpoint(不是MvcEndpoint),Spring Boot将会为你分配路径。

47.3 自定义管理服务器端口

对于基于云的部署,使用默认的HTTP端口暴露管理端点(endpoints)是明智的选择。然而,如果你的应用是在自己的数据中心运行,那你可能倾向于使用一个不同的HTTP端口来暴露端点。management.port属性可以用来改变HTTP端口:

management.port=8081

由于你的管理端口经常被防火墙保护,不对外暴露也就不需要保护管理端点,即使你的主应用是受保护的。在这种情况下,classpath下会存在Spring Security库,你可以设置以下属性来禁用安全管理策略(management security):

management.security.enabled=false

(如果classpath下不存在Spring Security,那也就不需要显式的以这种方式来禁用安全管理策略,它甚至可能会破坏应用程序。)

47.4 配置管理相关的SSL

当配置使用一个自定义端口时,管理服务器可以通过各种management.ssl.*属性配置自己的SSL。例如,以下配置允许通过HTTP访问管理服务器,通过HTTPS访问主应用:

server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:store.jks
server.ssl.key-password=secret
management.port=8080
management.ssl.enable=false

或者,主应用服务器和管理服务器都使用SSL,但key stores不一样:

server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:main.jks
server.ssl.key-password=secret
management.port=8080
management.ssl.enable=true
management.ssl.key-store=classpath:management.jks
management.ssl.key-password=secret

47.5 自定义管理服务器地址

你可以通过设置management.address属性来定义管理端点使用的地址,这在你只想监听内部或面向生产环境的网络,或只监听来自localhost的连接时非常有用。

如果端口跟主应用服务器不一样,你只能监听一个不同的地址。

下面的application.properties示例不允许远程访问管理服务器:

management.port=8081
management.address=127.0.0.1

47.6 禁用HTTP端点

如果不想通过HTTP暴露端点,你可以将管理端口设置为-1: management.port=-1

47.7 HTTP health端点访问限制

health端点暴露的信息依赖于是否为匿名访问,应用是否受保护。默认情况下,当匿名访问一个受保护的应用时,任何有关服务器的健康详情都被隐藏了,该端点只简单的展示服务器运行状况(up或down)。此外,响应会被缓存一个可配置的时间段以防止端点被用于'拒绝服务'攻击,你可以通过endpoints.health.time-to-live属性设置缓存时间(单位为毫秒),默认为1000毫秒,也就是1秒。

你可以增强上述限制,从而只允许认证用户完全访问一个受保护应用的health端点,将endpoints.health.sensitive设为true可以实现该效果,具体可查看以下总结(sensitive标识值为"false"的默认加粗):

management.security.enabled endpoints.health.sensitive 未认证 认证
false false 全部内容 全部内容
false true 只能查看Status 全部内容
true false 只能查看Status 全部内容
true true 不能查看任何内容 全部内容